/**
 * Copyright (c) 2010 Jesco Freund.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Backtory nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *  $Id$
 */


#include <errno.h>
#include <iconv.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#include "_unicode.h"


extern int
yar_unicode_ucsize(char *string, size_t len, const char *encoding, size_t *result)
{
	char *rbuf = NULL;
	size_t rlen = len * 6 + 1;
	iconv_t ic = iconv_open("UTF-8", encoding);

	*result = 0;

	/* No iconv descriptor? => errno should be set */
	if (ic == ((iconv_t)-1))
		return errno;
	
	rbuf = (char *)malloc(rlen);
	if (NULL == rbuf)
		return ENOMEM;
	
	memset(rbuf, '\0', rlen);
	rlen--;
	
	if (iconv(ic, &string, &len, &rbuf, &rlen) == (size_t)-1)
		return  errno;
	
	if (iconv_close(ic) < 0)
		return errno;
	
	*result = strlen(rbuf);
	free(rbuf);
	rbuf = NULL;
	
	return 0;
}


extern int
yar_unicode_convert(char *source, size_t source_len, const char *encoding, char *result, size_t result_len)
{
	iconv_t ic = iconv_open("UTF-8", encoding);
	if (ic == ((iconv_t)-1))
		return errno;
	
	if (iconv(ic, &source, &source_len, &result, &result_len) == (size_t)-1)
		return errno;
	
	if (iconv_close(ic) < 0)
		return errno;
	
	return 0;
}
